package jvm规范;
/*
【延迟加载】
一个类什么时候被加载到JVM呢？JVM运行时并不是将工程依赖的所有类，一次性全加载到内存实例化成Class对象，而是按需加载，也称延迟加载。程序在运行过程中会逐步
加载其需要用到的类，一个类一旦被ClassLoader加载过后就会缓存在内存中，程序运行中要再次使用该类的话会直接从缓存中取出。

当程序调用某个类的静态方法时，该类肯定要被加载的，但该类的实例成员变量对应的类并不需要加载，但静态成员变量对应的类可能会被加载，因为静态方法可能会访问该
静态成员变量。而实例成员变量对应的类需要等到实例化对象的时候才会加载。
*/
public class ClassLazyLoadTest {
  public static void main(String[] args) {
    MainClass.callStaticMethod();
  }
  static class MainClass {
    FieldClass fieldClass;
    static void callStaticMethod() {
    }
  }
  static class FieldClass {
  }
}
/*上面的代码启动时加上VM参数 -verbose:class 能看到有哪些类被加载到JVM中。运行结果如下：

...
[0.037s][info][class,load] java.security.SecureClassLoader$DebugHolder source: shared objects file
[0.037s][info][class,load] sun.security.util.Debug source: shared objects file
[0.037s][info][class,load] jvm规范.ClassLazyLoadTest source: file:/F:/eclipse-workspace/jvm%e8%a7%84%e8%8c%83/bin/
[0.037s][info][class,load] java.lang.PublicMethods$MethodList source: shared objects file
[0.037s][info][class,load] java.lang.PublicMethods$Key source: shared objects file
[0.037s][info][class,load] java.lang.Void source: shared objects file
[0.037s][info][class,load] jvm规范.ClassLazyLoadTest$MainClass source: file:/F:/eclipse-workspace/jvm%e8%a7%84%e8%8c%83/bin/
[0.037s][info][class,load] java.lang.Shutdown source: shared objects file
[0.037s][info][class,load] java.lang.Shutdown$Lock source: shared objects file

可以看到ClassLazyLoadTest类与MainClass类被加载到JVM中，而FieldClass类虽然是MainClass类的实例成员变量，但由于main方法中调
用MainClass.callStaticMethod()时只需要类MainClass就行，而FieldClass类只有当实例化MainClass对应的对象时才需要加载。
*/
